/*
 * @Author: Clark
 * @Email: haixuanwoTxh@gmail.com
 * @Date: 2023-01-05 15:17:49
 * @LastEditors: Clark
 * @LastEditTime: 2023-01-09 16:19:55
 * @Description: file content
 */

#include "apue.h"
#include <errno.h>
#include <sys/time.h>

unsigned long long count;
struct timeval end;

void checktime(char *str)
{
    struct timeval tv;

    gettimeofday(&tv, NULL);
    if (tv.tv_sec >= end.tv_sec && tv.tv_usec >= end.tv_usec)
    {
        printf("%s count = %lld\n", str, count);
        exit(0);
    }
}

int main(int argc, char *argv[])
{
    pid_t pid;
    char *s = NULL;
    int nzero = 0;
    int ret = -1;
    int adj = 0;

    setbuf(stdout, NULL);

#define NZERO 1
#if defined(NZERO)
    nzero = NZERO;
#elif defined(_SC_NZERO1)
    nzero = sysconf(_SC_NZERO);
#else
#error NZERO undefined
#endif

    printf("NZERO = %d\n", nzero);

    if (2 == argc)
        adj = strtol(argv[1], NULL, 10);

    gettimeofday(&end, NULL);
    end.tv_sec += 10;

    if ((pid = fork()) < 0)
    {
        err_sys("fork failed");
    }
    else if (0 == pid)
    {
        s = "child";
        printf("current nice value in child is %d, adjusting by %d\n", nice(0) + nzero, adj);
        errno = 0;

        if ((ret = nice(adj)) == -1 && errno != 0)
        {
            err_sys("child set scheduling priority");
        }
        printf("now child nice value is %d\n", ret+nzero);
    }
    else
    {
        s = "parent";
        printf("current nice value in parent is %d\n", nice(0)+nzero);
    }


    for (;;)
    {
        if (++count == 0)
        {
            err_quit("%s counter wrap", s);
        }
        checktime(s);
    }
}
